In Verilog, there are two primary ways to assign values to variables inside procedural blocks: Blocking and Non-blocking.


**Blocking Assignments

Execution

Modeling

Example

always @(*) begin
    a = b + c;
    d = a * 2; // 'd' uses the updated value of 'a'
end

**Non-Blocking Assignments

Execution

Modeling

Example

always @(posedge clk) begin
    q <= d;
    next_q <= q; // 'next_q' gets the previous value of 'q'
end